% OUT:
% 1 - robot pomyslnie przemieszczony na kolejne pole
% 0 - przemieszczenie robota nie bylo mozliwe
function ret=wykonaj_ruch(indeks)
    global roboty;
    global stan_robotow;
    global czas;
    global mapa;

    robot = roboty(indeks);
    ret=0;
    
    %jesli sciezka jest niezerowa to sprobuj wykonac ruch
    if (~isequal(robot.droga(1,:),[0 0]))
        % proba rezerwacji pola
        if(rezerwuj(1,indeks,robot.droga(1,:))==1) % zarezerwowane pomyslnie
            roboty(indeks).cierpliwosc = 6;
            
            % nie zmieniaj rezerwacji, jesli kolejne pole jest tym na
            % ktorym robot jest aktualnie
            if(~isequal(robot.droga(1,:),robot.pozycja))
                poprzednia_pozycja=robot.pozycja;

                % zmiana pozycji
                roboty(indeks).pozycja=robot.droga(1,:);
                wektor=roboty(indeks).pozycja-poprzednia_pozycja;
                roboty(indeks).kierunek = indeks_kierunku(wektor);
                ret=1;

                % zdjecie rezerwacji z opuszczonego pola
                if(~isequal(poprzednia_pozycja,[0 0]))
                    rezerwuj(0,indeks,poprzednia_pozycja);
                end;
            end;
            
            %teraz zmieniamy wsporzedne tablicy poniewaz posunelismy sie o kawalek
            max=size(robot.droga,1);
            roboty(indeks).droga = [robot.droga(2:max,:) ; 0 0];
                
            % jesli robot porusza sie w glownym korytarzu i jest w
            % poblizu swojego celu, powinien rozpoczac kolejkowanie,
            % aby uniknac dojechania do samego celu (wjazdu korytarza/kasy),
            % a potem wycofania, aby pojechac do kolejki
            if(robot.stan==1 && size(robot.cel,2)==2 && abs(roboty(indeks).pozycja(1)-roboty(indeks).cel(1))+abs(roboty(indeks).pozycja(2)-roboty(indeks).cel(2))==1 && roboty(indeks).numer_kasy>0)
                rozpocznij_kolejkowanie(indeks);
            end;
            
        else % pole niedostepne
            
            % manewrowanie, tylko jesli robot jest w magazynie
            if(~isequal(robot.pozycja,[0 0]))
                % rozpocznij kolejkowanie, jesli pole jest zajete przez robota
                % oczekujacego do tego samego korytarza
                indeks2=mapa(robot.droga(1,1),robot.droga(1,2));
                
                if(indeks2~=0 && indeks2~=indeks && ((roboty(indeks2).stan==4 && roboty(indeks2).indeks_korytarza==robot.indeks_korytarza && robot.indeks_korytarza~=0) || ((roboty(indeks2).stan==4 || roboty(indeks2).stan==6) && roboty(indeks2).numer_kasy==robot.numer_kasy && robot.numer_kasy~=0 && roboty(indeks2).indeks_korytarza==0))) %kolejkowanie
                        rozpocznij_kolejkowanie(indeks);
                elseif(roboty(indeks).cierpliwosc>0)
                    indeks_poprzedniego=mapa(robot.droga(1,1),robot.droga(1,2));
                    % jesli poprzedni robot wykonuje kolejkowanie, to nie
                    % czekaj, az sie poruszy
                    if(roboty(indeks_poprzedniego).stan==4)
                        roboty(indeks).cierpliwosc = 0;
                    else
                        roboty(indeks).cierpliwosc = roboty(indeks).cierpliwosc - 1;
                    end;
                else % podjecie innego dzialania
                    roboty(indeks).cierpliwosc = 6;
                    
                    % sprobuj wykonac manewr wyprzedzania
                    if(rozpocznij_manewr_wyprzedzania(indeks)==0) % niepowodzenie
                        dijkstry(roboty(indeks).pozycja,roboty(indeks).cel,indeks,roboty(indeks).droga(2,:));
                    end;
                end;
            end;
        end;
    else 
        % zerowa sciezka oznacza zakonczenie aktualnego dzialania i
        % koniecznosc przejscia do kolejnego stanu
        
        if(robot.stan==1) % ruch w glownym korytarzu
            
            if(isequal(robot.pozycja,[0 0]))
                % robot wyjezdza z zajezdni
                roboty(indeks).pozycja=[11 1];
                roboty(indeks).kierunek=3;
            elseif(isequal(robot.pozycja,[11 1]) && robot.numer_kasy==0)
                % robot wjezdza do zajezdni
                roboty(indeks).stan=0;
                roboty(indeks).pozycja=[0 0];
                rezerwuj(0,indeks,[11 1]);
            elseif(size(roboty(indeks).produkty,2)>0)
                % oznacza, ze robot dojechal do docelowego korytarza i moze
                % rozpoczac manewr kolejkowania
                rozpocznij_kolejkowanie(indeks);
            else
                roboty(indeks).stan = 6; % rozladunek
            end;
            
        elseif(robot.stan==3) % wyprzedzanie
            
            roboty(indeks).stan=0; % stan 0 wymusi przeliczenie nowej drogi
            
        end;
        
    end;
